package caculate.strSearch;

import java.util.HashMap;
import java.util.Map;

/**
 * @program: rocsun
 * @description:
 * @author: yx.guo
 * @create: 2025-02-28 12:39
 **/
class Sunday extends StrMethod {

    public Sunday(String str, String pattern) {
        super(str, pattern);
    }

    /**
     * 核心是构建一个字符最后一次出现的位置表
     *
     * @return
     */
    @Override
    protected int searchStr() {
        Map<Character, Integer> table = new HashMap<>();
        this.buildTable(table);

        int j = 0;
        int i = 0;
        /**
         * 这里看成一个滑动窗口，长度为pLen，所以这个窗口的起始位置i最大只能到sLen-pLen；
         */
        while (i <= sLen - pLen) {
            /**
             * 循环比较窗口内的值，与格式串一致继续比较后一个；知道不匹配位置
             */
            while (j < pLen && str.charAt(i + j) == pattern.charAt(j)) {
                j++;
            }

            /**
             * 如果已经有pLen个匹配，表示完全匹配，此时返回i
             */
            if (j == pLen) {
                return i;
            }

            /**
             * 如果不匹配时没有完全匹配，寻找目标串中滑动窗口的后一个字符，看其在格式串中的位置，
             * 滑动该窗口使目标串中的该字符与格式串中的该字符对齐；
             * 如果格式串中不存在该字符；那么直接将窗口移动到该字符后面
             */
            int nextIndex = i + pLen;
            if (nextIndex >= sLen) break;
            i += pLen - table.getOrDefault(str.charAt(nextIndex),  -1);
        }

        return -1;
    }

    private void buildTable(Map<Character, Integer> table) {
        for (int i = 0; i < pLen; i++) {
            table.put(pattern.charAt(i), i);
        }
    }
}
